package com.atan.xiaohongshu.auth.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

/**
 * 解释
 * @Configuration 注解： 标记该类为 Spring 配置类。
 * @MapperScan 注解： 指定 MyBatis 的 Mapper 接口所在的包路径。
 * sqlSessionFactory 方法：
 * 创建 SqlSessionFactoryBean 实例。
 * 设置数据源和 Mapper XML 文件的位置。
 * 创建 MyBatis 的 Configuration 对象，并注册自定义类型别名 VARCHAR 对应 String.class。
 * 将配置对象设置到 SqlSessionFactoryBean 中。
 * 通过这种方式，你可以在不修改 XML 文件的情况下，通过 Java 配置类来添加自定义类型别名。
 * 注意事项
 * 确保你的 SqlSessionFactory 配置正确，并且数据源已经正确注入。
 * 如果你已经在其他地方配置了 SqlSessionFactory，请合并配置，避免冲突。
 * 这样配置后，MyBatis 就会识别 VARCHAR 作为 String 的别名，从而解决之前遇到的解析错误。
 *
 *
 */
@Configuration
@MapperScan("com.atan.xiaohongshu.auth.domain.mapper")
public class MyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/*.xml"));

        // 添加自定义类型别名
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.getTypeAliasRegistry().registerAlias("VARCHAR", String.class);
        //开启驼峰
        configuration.setMapUnderscoreToCamelCase(true);
        sessionFactory.setConfiguration(configuration);
        return sessionFactory.getObject();
    }
}
